/* Includes ------------------------------------------------------------------*/
#include "app.h"
#include "config.h"

/* Private variables ---------------------------------------------------------*/

/* 固件更新的标志位，该标志位不能被清零 */
#if (USING_IS_NEED_UPDATE_PROJECT == USING_APP_SET_FLAG_UPDATE)
    #if defined(__IS_COMPILER_ARM_COMPILER_5__)
        volatile uint64_t update_flag __attribute__((at(FIRMWARE_UPDATE_VAR_ADDR), zero_init));

    #elif defined(__IS_COMPILER_ARM_COMPILER_6__)
        #define __INT_TO_STR(x)     #x
        #define INT_TO_STR(x)       __INT_TO_STR(x)
        volatile uint64_t update_flag __attribute__((section(".bss.ARM.__at_" INT_TO_STR(FIRMWARE_UPDATE_VAR_ADDR))));

    #else
        #error "variable placement not supported for this compiler."
    #endif
#endif



/* Private function prototypes -----------------------------------------------*/
static void _APP_Reset(void);

#define BSP_INT_EN()                        __enable_irq()
#define BSP_INT_DIS()                       __disable_irq()

/* Exported functions ---------------------------------------------------------*/
/**
 * @brief  外设初始化前的一些处理
 * @note   执行到此处，内核时钟已初始化
 * @retval None
 */
void System_Init(void)
{
    /* 设置中断向量表后，开启总中断 */
    extern int Image$$ER_IROM1$$Base;
    BSP_INT_DIS();
    SCB->VTOR = (uint32_t)&Image$$ER_IROM1$$Base;
    BSP_INT_EN();
}
#include "Version.h"

/**
 * @brief  应用初始化
 * @note   此时外设已经初始化完毕
 * @retval None
 */
void APP_Init(void)
{
    uint32_t hal_version = HAL_GetHalVersion();

    LOG_info("************************[APP] CCTVCAR************************\r\n");
    LOG_info("UID: %.8X %.8X %.8X\r\n", HAL_GetUIDw0(), HAL_GetUIDw1(), HAL_GetUIDw2());
    LOG_info("HAL Version: V%d.%d.%d.%d\r\n", (hal_version >> 24), (uint8_t)(hal_version >> 16), (uint8_t)(hal_version >> 8), (uint8_t)hal_version);
    PrintVersionInformation();
    LOG_info("**************************************************************\r\n");
}


/**
 * @brief  应用开始运行
 * @note   APP_Running 本身就在一个 while 循环内
 * @retval None
 */
void APP_Running(void)
{

}


/* Private functions ---------------------------------------------------------*/
/**
 * @brief  APP 软复位的处理函数
 * @note
 * @retval None
 */
static inline void _APP_Reset(void)
{
    HAL_NVIC_SystemReset();
}


/**
 * @brief  按键的事件处理
 * @note
 * @param[in]  id: 按键的 ID
 * @param[in]  event: 按键的事件
 * @retval None
 */
static void _Key_EventCallback(uint8_t id)
{


    update_flag = FIRMWARE_UPDATE_MAGIC_WORD;
    _APP_Reset();

    update_flag = FIRMWARE_RECOVERY_MAGIC_WORD;
    _APP_Reset();

}

void OTA_UPDATE(void)
{    
	update_flag = FIRMWARE_UPDATE_MAGIC_WORD;
    _APP_Reset();

}

void OTA_RECOVERY(void)
{
    update_flag = FIRMWARE_RECOVERY_MAGIC_WORD;
    _APP_Reset();
}

/**
 * @brief  参数检查错误时的处理函数
 * @note
 * @param[in]  func: 错误发生的所在函数
 * @param[in]  line: 错误发生的所在c文件的行数
 * @retval None
 */
void Assert_Failed(uint8_t *func, uint32_t line)
{

    while (1);
}





